<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
        <title> Proposed HTML Timed Media Elements </title> 

        <link href="./mediaelement.css" rel="stylesheet" type="text/css"> 

        <style type="text/css">
                h4 + .element { margin-top: -2.5em; padding-top: 2em; }
                h4 + p + .element { margin-top: -5em; padding-top: 4em; }
                .element { background: #EFE; color: #000; margin: 0 0 1em -1em; padding: 0 1em 0.25em 0.75em; border-left: solid #9F9 0.25em; -padding: 0; /* that last decl is for IE6. Try removing it, it's hilarious! */ }
                .proposal { border: blue solid; padding: 1em; }
                table.matrix, table.matrix td { border: none; text-align: right; }
                table.matrix { margin-left: 2em; }

                .history table { width: 100%; }
                .history, .history td, .history th { border: solid thin; font-size: x-small }
                td.hauthor, td.hdate { width: 10%; }
                td.hversion { width: 5%; text-align: center; }
                td.hchange { width: 100%; }
                
                .event-definition table { border: solid thin #000; width: 95%; }
                .event-definition tr:last-child td { border: none; }
                .event-definition th { text-align: left; font-weight: bold; border: none; border-right: 1px dashed #ccc; border-bottom: 1px dashed #ccc; white-space: nowrap; background-color: #F7F5D7; padding-left: 8px; padding-right: 8px; }
                .event-definition td { width: 100%; font-family: monospace; font-weight: normal; padding-left: 1em; background-color: transparent; padding-right: 1em; border: none; }

                /* needed to override wiki CSS */
                a, a:link { text-decoration: underline;}
                th { color: #000; }
                
                .obsolete {
                  font-size: larger;
                  color: red;
                }
        </style>

</head>

<body class="draft">

        <div class="head">
                <h1> HTML Timed Media Elements </h1> <h2 class="no-num no-toc" id="working"> Working Draft &mdash; 19 March 2007 </h2> 
                <p class="copyright">&copy; Copyright 2007 Apple Inc. All rights reserved.</p>

        </div>
        <h2 class="no-num no-toc" id="abstract"> Abstract </h2> 

        <p>This specification introduces features to HTML and the DOM for native support of timed media,
        including but not limited to video and audio. </p>
        
        <h2 class="no-num no-toc" id="status"> Status of this document </h2> 

        <p class="obsolete"><strong>This document is obsolete. Media Elements are now specified in the <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html" title="4.8.6 The video element &mdash; HTML5 (including next generation additions still in development)">HTML5 specification</a>.</strong></p>
        
        <h2 class="no-num no-toc"id="contents"> Table of contents </h2>

        <!--begin-toc-->
        <ul class="toc">
                <li><a href="#introduction"><span class="secno">1.</span> Introduction</a> 
                        
                <li><a href="#elements"><span class=secno>2.</span> Elements</a>
                        <ul class=toc>

                                <li><a href="#the-video-element"><span class=secno>2.1.</span> 
                                The <code title=element-video>video </code>element</a>
                                <ul class=toc>
                                        <li><a href="#video-element-attributes"><span class=secno>2.1.1.</span> Element attributes</a>
                                        <li><a href="#video-dom-attributes"><span class=secno>2.1.2.</span>DOM attributes</a>
                                </ul>

                                <li><a href="#the-audio-element"><span class=secno>2.2.</span> 
                                The <code title=element-audio>audio</code> element</a>

                                <li><a href="#the-common-attributes"><span class=secno>2.3.</span>  
                                Attributes and methods common to <code title=element-video>video</code> and 
                                <code title=element-audio>audio</code> elements</a>

                                        <ul class=toc>
                                                <li><a href="#common-element-attributes"><span class=secno>2.3.1.</span> Element attributes</a>
                                                <li><a href="#common-dom-attributes"><span class=secno>2.3.2.</span> DOM attributes and methods</a>
                                                <ul class=toc>
                                                        <li><a href="#time-attributes"><span class=secno>2.3.2.1.</span> Time</a>
                                                        <li><a href="#playback-attributes"><span class=secno>2.3.2.2.</span> Playback</a>
                                                        <li><a href="#audio-attributes"><span class=secno>2.3.2.3.</span> Audio</a>
                                                        <li><a href="#looping-attributes"><span class=secno>2.3.2.4.</span> Looping</a>
                                                        <li><a href="#characteristics-attributes"><span class=secno>2.3.2.5.</span> Characteristics</a>
                                                        <li><a href="#state-attributes"><span class=secno>2.3.2.6.</span> State</a>
                                                        <li><a href="#time-triggers"><span class=secno>2.3.2.7.</span> Time triggers</a>
                                                </ul>
                                        </ul>
                        </ul>

                <li><a href="#events"><span class=secno>3.</span> Events</a>
                        <ul class=toc>
                                <li><a href="#load-events"><span class=secno>3.1.</span> 
                                Media loading events</a>

                                <li><a href="#playback-events"><span class=secno>3.1.</span> 
                                Media playback events</a>
                        </ul>

                <li><a href="#window-additions"><span class=secno>4.</span> WindowHTML Additions</a>

                <li class=no-num><a href="#references">References</a>
                
                <li class=no-num><a href="#acknowledgements">Acknowledgements</a>

        </ul>
        <!--end-toc-->

        <hr>
        <h2 id="introduction"><span class="secno">1.</span> Introduction</h2> 
        <p><em>This section is non-normative.</em></p>

        <p>While the World Wide Web has already been enriched by a variety of audio and video media,
        support for timed media in user agents is currently provided by a variety of implementations
        with their own peculiar sets of interfaces and behaviors. This proposal outlines a set of
        standard interfaces and behaviors for timed media that can be supported by a variety of
        implementations and applied to multiple audiovisual formats, with the goal of conferring upon
        these types of media the benefits of native support, such as styling for presentation, improved
        accessibility, and the opportunity to achieve greater uniformity of behavior.</p>

        <p>Certain intrinsic characteristics of timed media and of its presentation must influence the
        specifics of such a proposal:

        <ul>
                <li> A presentation of timed media may encompass one or more media substreams, e.g. video
                and audio, that are rendered in concert with each other over time.

                <li> Resources containing timed media may be very large in size, even indefinitely large,
                and loaded and presented incrementally over time.

                <li> A variety of protocols can be used to load timed media for presentation, and the rules
                for use of these protocols vary. Some are intelligent about the timing characteristics of
                media streams and others are not. Some are file-based protocols and others are not. Some
                permit random access in the byte domain or in the time domain and others provide sequential
                access only.

                <li> Various states of timed media elements are subject to change, e.g. they can be ready to
                play or not ready to play, they can be playing or not, they can be actively loading data or
                not.

                <li> The properties of timed media elements can change with the availability of additional
                data according to the media formats and protocols in use, e.g. their total duration, their
                natural width and height, and even the number and type of media substreams they encompass.
        </ul>

        <p>In sum timed media is inherently dynamic, not only in its presentation but also in its
        behavior. The current proposal is intended to provide standard mechanisms for controlling and
        responding to this dynamism, while deferring to the user agent the choice of degree of dynamism
        that's useful and supportable.</p>

        
        <h2 id="elements"><span class="secno">2.</span> New Elements</h2> 
        
        <h4 id=the-video-element><span class=secno>2.1.</span> The <dfn id=video title=element-video>
        <code>video</code></dfn> element</h4>

        <dl class=element>

                <dd><a href="http://www.whatwg.org/specs/web-apps/current-work/#strictly">Strictly inline-level</a> 
                <a href="http://www.whatwg.org/specs/web-apps/current-work/#embedded0">embedded content</a>. 

                <dt>Contexts in which this element may be used: 

                <dd>As the only <a href="http://www.whatwg.org/specs/web-apps/current-work/#embedded0">embedded content</a> 
                child of a <code><a href="http://www.whatwg.org/specs/web-apps/current-work/#figure0">figure</a></code> element. 

                <dd>Where <a href="http://www.whatwg.org/specs/web-apps/current-work/#strictly">
                strictly inline-level content</a> is allowed.

                <dt>Content model: 

                <dd>When used as the child of a 
                <code><a href="http://www.whatwg.org/specs/web-apps/current-work/#figure0">figure</a></code>
                element, or, when used as a 
                <em><code><a href="http://www.whatwg.org/specs/web-apps/current-work/#figure0">figure</a></code> fallback 
                <code><a href="#video">video</a></code></em>: zero or more 
                <a href="http://www.whatwg.org/specs/web-apps/current-work/#block-level1">block-level elements</a> 
                or a single
                <code><a href="#video">video</a></code> element, which is then considered to be a
                <em><code><a href="http://www.whatwg.org/specs/web-apps/current-work/#figure0">figure</a></code> fallback 
                <code><a href="#video">video</a></code></em>.

                <dd>Otherwise:
                <a href="http://www.whatwg.org/specs/web-apps/current-work/#inline-level1"> inline-level content</a>.

                <dt>Element-specific attributes: 
                        <dd><code title="attr-media-src"><a href="#attr-src">src</a></code> (required) 
                        <dd><code title="attr-media-type"><a href="#attr-type">type</a></code>
                        <dd><code title="attr-video-height"><a href="#attr-height">height</a></code> 
                        <dd><code title="attr-video-width"><a href="#attr-width">width</a></code> 
                        <dd><code title="attr-media-autoplay"><a href="#attr-autoplay">autoplay</a></code>
                        <dd><code title="attr-media-controller"><a href="#attr-controller">controller</a></code>
                        
                <dt>Predefined classes that apply to this element: 
                <dd>None. 

                <dt>
                        DOM interface: 
                <dd>
<pre class="idl">interface <dfn id=html-video-element>HTMLVideoElement : HTMLTimedMediaElement</dfn> {
           attribute long <a href="#dom-video-height" title="video-element-height">height</a>;
           attribute long <a href="#dom-video-width" title="video-element-width">width</a>;
};</pre> 

                <p class=note>An instance of <code><a
                href="#html-video-element">HTMLVideoElement</a></code> can be obtained using
                the <code title=dom-video-constructor><a href="#video-constructor">Video</a></code> constructor.</p>

        </dl>

        <p>A <code title=element-video><a href="#video">video</a></code> element represents a video or
        movie, with an alternate representation given by its contents.

        <h6 id="video-element-attributes"><span class=secno>2.1.1.</span> Video specific element attributes</h6>
        
                <p>The <dfn id=attr-height title=attr-video-height><code>height</code></dfn> and
                <dfn id=attr-width title=attr-video-width><code>width</code></dfn> attributes
                give the preferred rendered dimensions of the media file if it is to be
                shown in a visual medium. If only one is specified, the size the other 
                is scaled preserving the media resource's intrinsic aspect ratio. These attributes must be either 
                <a href="http://www.whatwg.org/specs/web-apps/current-work/#valid" title="valid non-negative integer">
                valid non-negative integers</a> or 
                <a href="http://www.whatwg.org/specs/web-apps/current-work/#valid3" title="valid non-negative percentage">
                valid non-negative percentages.</a></p>
                
                <p>See below for definitions of 
                        <code title="attr-media-src"><a href="#attr-src">src</a></code>,
                        <code title="attr-media-type"><a href="#attr-type">type</a></code>,
                        <code title="attr-media-autoplay"><a href="#attr-autoplay">autoplay</a></code>, and
                        <code title="attr-media-controller"><a href="#attr-controller">controller</a></code>
                </p>


        <h6 id="video-dom-attributes"><span class=secno>2.1.2.</span> Video specific DOM attributes</h6>
                <p>The DOM attributes <dfn id=dom-video-height title=video-element-height>
                <code>height</code></dfn> and <dfn id=dom-video-width
                title=video-element-width><code>width</code></dfn> must return the rendered
                height and width of the media resource, in CSS pixels, if the media resource is being
                rendered and is being rendered to a visual medium, or 0 otherwise. 
                <a href="#refsCSS21">[CSS21]</a></p>
        
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

        <h4 id=the-audio-element><span class=secno>2.2. </span>The <dfn id=audio title=element-audio>
        <code>audio</code></dfn> element</h4>

        <p><a href="http://www.whatwg.org/specs/web-apps/current-work/#strictly">Strictly 
        inline-level</a> <a href="http://www.whatwg.org/specs/web-apps/current-work/#embedded0">embedded content</a>. 

        <dl class=element>

                <dt>Contexts in which this element may be used: 

                <dd>As the only <a href="http://www.whatwg.org/specs/web-apps/current-work/#embedded0">embedded content</a> 
                child of a <code><a href="http://www.whatwg.org/specs/web-apps/current-work/#figure0">figure</a></code> element. 

                <dd>Where <a href="http://www.whatwg.org/specs/web-apps/current-work/#strictly">
                strictly inline-level content</a> is allowed.

                <dt>Content model: 

                <dd>When used as the child of a 
                <code><a href="http://www.whatwg.org/specs/web-apps/current-work/#figure0">figure</a></code>
                element, or, when used as a 
                <em><code><a href="http://www.whatwg.org/specs/web-apps/current-work/#figure0">figure</a></code> fallback 
                <code><a href="#audio">audio</a></code></em>: zero or more 
                <a href="http://www.whatwg.org/specs/web-apps/current-work/#block-level1">block-level elements</a> 
                or a single
                <code><a href="#audio">audio</a></code> element, which is then considered to be a
                <em><code><a href="http://www.whatwg.org/specs/web-apps/current-work/#figure0">figure</a></code> fallback 
                <code><a href="#audio">audio</a></code></em>.

                <dd>Otherwise:
                <a href="http://www.whatwg.org/specs/web-apps/current-work/#inline-level1"> inline-level content</a>.

                <dt>Element-specific attributes: 
                        <dd><code title="attr-media-src"><a href="#attr-src">src</a></code> (required) 
                        <dd><code title="attr-media-type"><a href="#attr-type">type</a></code>
                        <dd><code title="attr-media-autoplay"><a href="#attr-autoplay">autoplay</a></code>
                        <dd><code title="attr-media-controller"><a href="#attr-controller">controller</a></code>
                        
                <dt>Predefined classes that apply to this element: 
                <dd>None. 

                <dt>DOM interface: 
                <dd> No difference from <code><a href="#html-timed-media-element">HTMLTimedMediaElement</a></code>.

    <p class=note>An instance of <code><a
     href="#html-audio-element">HTMLAudioElement</a></code> can be obtained using
     the <code title=dom-audio-constructor><a href="#audio">Audio</a></code> constructor.</p>

        </dl>

        <p>Audio objects have no spatial representation. They are heard and not seen. Otherwise they have 
        the same API as video objects.</p>
        
        <p>The user agent must render only the audio media contained in the resource, regardless of
        whatever else it might contain. If the source is an MP3 file containing synchronized lyrics, for
        example, the user agent must render only the audio and not the text.</p>


        <p>See below for definitions of 
                <code title="attr-media-src"><a href="#attr-src">src</a></code>,
                <code title="attr-media-type"><a href="#attr-type">type</a></code>,
                <code title="attr-media-autoplay"><a href="#attr-autoplay">autoplay</a></code>, and
                <code title="attr-media-controller"><a href="#attr-controller">controller</a></code>
        </p>

        <p class="big-issue">Need some words about using only audio when media file has both audio and 
        video.</p>


<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

        <h3 id=the-common-attributes><span class=secno>2.3.</span> Attributes common to the
        <code title=element-video>video</code> and <code title=element-audio>audio</code> elements</h3>

        <h5 id=common-element-attributes><span class=secno>2.3.1.</span> 
        Element attributes common to <code title=element-video>video</code> and 
        <code title=element-audio>audio</code> elements.</h5>

        <p>The <dfn id="attr-src" title="attr-media-src"><code>src</code></dfn> attribute
        must contain the URI (or IRI) of the media resource.
        
        <p>When the src attribute is set and the specified resource has a supported type, the user agent
        must prepare to present it according to the appropriate transfer protocol. This may entail the
        initiation of network sessions, including but not limited to file transfers. If the presentation
        of timed media by the user agent has been disabled, if the resource has an unsupported type, or
        if the preparations for its presentation fail either because of a protocol failure or because
        the format of the media is unrecognized, the user agent must fire an error event on the element
        and display the element's fallback content, if available.</p>

        <p>The user agent may choose to proceed with the presentation of media that it can render
        only partially, for any of the following reasons:

        <ul>
                <li> A media type is not supported, i.e. the resource contains one or more renderable substreams
                of types not supported by the user agent.  Example: a 3GPP file with timed text on a device that
                does not have a text renderer.

                <li> A media format is not supported, i.e. a renderable substream of a type that's supported by
                the user agent contains media that can't be decoded. Example: a user agent that supports only
                H.264 at baseline profile encounters an MPEG-4 file with a video track with H.264 frames encoded
                in main profile.

                <li> Media can't be rendered under current constraints. Here there's no problem with media types
                or formats but the resource can't be rendered anyway, possibly temporarily. Example: a user
                agent that can decode only one H.264 video stream at a time is requested to decode multiple
                streams simultaneously.
        </ul>

        <p>From the user's perspective, these cases look very much the same because their only obvious
        symptom is that some or all of the media cannot be rendered. In this case, the user agent may emit
        a <code title=event-mediarendererror><a href="#eventdef-event-mediarendererror">mediarendererror</a></code>.

        <p>The <dfn id=attr-type title=attr-media-type><code>type</code></dfn>
        attribute, if present, gives the MIME type of the media resource specified 
        by <code title="attr-media-src"><a href="#attr-src">src</a></code>. This attribute is optional 
        but recommended as it allows the user agent to avoid loading  information for unsupported 
        content types. The value must be a valid MIME type <a href="#refsRFC2046">
        [RFC2046]</a>, optionally with parameters indicating the codec(s) required to render the content
        <a href="#refsRFC4281">[RFC4281]</a>. The <code title=attr-media-type>type</code> attribute 
        is purely advisory and is only intended for static fallback, it is only considered when deciding
        whether to initiate a load or not.</p>

        <p>The <code title=attr-media-type>type</code> attribute can thus be used by the page author 
        to select different content for different user agent configurations. For the following example:
<pre >
&lt;video src="big_264.mp4" type="video/mp4; codecs=mp4v.21.3"&gt;
    &lt;video src="medium.mp4" type="video/mp4; codecs=mp4v.20.9"&gt;
        &lt;img src="small.png" alt="alternate image for non-video browsers /&gt;
    &lt;/video&gt;
&lt;/video&gt;
</pre>

        <p>the user agent would choose the outmost &lt;video&gt; if it supports H.264 visual simple profile
        level 1, else the inner &lt;video&gt; if it suports MPEG-4 visual simple profile level 0, else the 
        &lt;img&gt; if it supports PNG, else the alternate text.

        <p>Because the supportability and desirability of media container formats and media encoding
        formats vary widely according to the needs and constraints of user agents, the process of static
        fallback for HTML timed media elements allows the user agent to examine multiple descriptive
        attributes that indicate the suitability of a given resource for loading and presentation.

        <ol>
                <li> Examine the <code title=attr-media-type><a href="#attr-type">type</a></code> attribute,
                if present. If not present proceed to step 2.
        
                If the <code title=attr-media-type><a href="#attr-type">type</a></code>, optionally including
                information about the codec(s) required to render it as described in RFC 4281, is not supported
                by the user agent, the element doesn't represent anything except what its contents
                represent and static fallback may ensue. <a href="#refsRFC4281">[RFC4281]</a>
        
                <li> Begin a load of the resource specified by the 
                <code title=attr-media-src><a href="#attr-src">src</a></code> attribute. Note that dynamic 
                fallback may ensue for a variety of reasons. See the discussion of 
                "<code title=event-mediarendererror><a href="#eventdef-event-mediarendererror">mediarendererror</a></code>"
                below.
        </ol>

        <p class="big-issue">Should there be other advisory markup attributes in order to describe
        content even more precisely, e.g. dataRate? Should CSS Media Queries be extended to support 
        bandwidth?

        <p>The <dfn id=attr-autoplay title=attr-media-autoplay><code>autoplay</code></dfn> attribute is a 
        <a href="http://www.whatwg.org/specs/web-apps/current-work/#boolean0">boolean attribute</a>.
        If the attribute is present, the user agent must begin playing the element as soon as it 
        estimates that playback will not be interrupted to rebuffer.</p>

        <p>The <dfn id=attr-controller title=attr-media-controller><code>controller</code></dfn> attribute is a 
        <a href="http://www.whatwg.org/specs/web-apps/current-work/#boolean0">boolean attribute</a>.
        If the attribute is present, the user agent must display a user interface which allows the user
        to control the media element. The <code title="attr-video-height"><a href="#attr-height">height</a></code> 
        attribute on the element does not include the size of the controller, it is the size of the 
        video element only. 
        <span class="big-issue">Should we specify the position of the controller?</span>
        <span class="big-issue">Should we specify <em>what</em> controls it should have?</span>
        </p>

        <p>The <code title=element-video><a href="#video">video</a></code>
        and <code title=element-audio><a href="#audio">audio</a></code>
        elements must implement the <code><a href="#html-timed-media-element">HTMLTimedMediaElement</a></code> interface:
        

<pre class="idl">interface <dfn id="html-timed-media-element">HTMLTimedMediaElement : HTMLElement</dfn> {
           attribute DOMString <a href="#dom-src" title="dom-media-src">src</a>;
           attribute DOMString <a href="#dom-type" title="dom-media-type">type</a>;

  // <a href="#time-attributes">Time</a>
           attribute float <a href="#starttime" title="dom-media-starttime">startTime</a>;
           attribute float <a href="#endtime" title="dom-media-endtime">endTime</a>;
           attribute float <a href="#currenttime" title="dom-media-currenttime">currentTime</a>;
  readonly attribute float <a href="#duration" title="dom-media-duration">duration</a>;
  readonly attribute float <a href="#availableduration" title="dom-media-availableduration">availableDuration</a>;

  // <a href="#playback-attributes">Playback</a>
           attribute float <a href="#currentrate" title="dom-media-currentrate">currentRate</a>;
           attribute float <a href="#playrate" title="dom-media-playrate">playRate</a>;
           attribute boolean <a href="#ispaused" title="dom-media-ispaused">isPaused</a>;

  void <a href="#play" title="dom-media-play">play</a>();
  void <a href="#pause" title="dom-media-pause">pause</a>();
  void <a href="#step" title="dom-media-step">step</a>(in long numberOfFrames);

  // <a href="#audio-attributes">Audio</a>
           attribute float <a href="#volume" title="dom-media-volume">volume</a>;
           attribute boolean <a href="#muted" title="dom-media-muted">muted</a>;
 
  // <a href="#looping-attributes">Looping</a>
           attribute long <a href="#loopcount" title="dom-media-loopcount">loopCount</a>;
           attribute long <a href="#currentloop" title="dom-media-currentloop">currentLoop</a>;
           attribute float <a href="#loopstarttime" title="dom-media-loopstarttime">loopStartTime</a>;
           attribute float <a href="#loopendtime" title="dom-media-loopendtime">loopEndTime</a>;

  // <a href="#characteristics-attributes">Characteristics</a>
           attribute boolean <a href="#hasaudio" title="dom-media-hasaudio">hasAudio</a>;
           attribute boolean <a href="#hasvisual" title="dom-media-hasvisual">hasVisual</a>;

  // <a href="#state-attributes">State</a>
  const unsigned short <a href="#uninitialized" title="dom-media-UNINITIALIZED">UNINITIALIZED</a> = 0;
  const unsigned short <a href="#error" title="dom-media-ERROR">ERROR</a> = 1;
  const unsigned short <a href="#understandable" title="dom-media-UNDERSTANDABLE">UNDERSTANDABLE</a> = 2;
  const unsigned short <a href="#presentable" title="dom-media-PRESENTABLE">PRESENTABLE</a> = 3;
  const unsigned short <a href="#playable" title="dom-media-PLAYABLE">PLAYABLE</a> = 4;
  const unsigned short <a href="#playthroughok" title="dom-media-PLAYTHROUGHOK">PLAYTHROUGHOK</a> = 5;
  const unsigned short <a href="#loaded" title="dom-media-LOADED">LOADED</a> = 6;

  readonly attribute long <a href="#mediastatus" title="dom-media-mediastatus">mediaStatus</a>;

  // <a href="#time-triggers">Timed triggers</a>
  void <a href="#settimetrigger" title="dom-media-settimetrigger">setTimeTrigger</a>(in float time, in TimeTriggerListener listener);
  void <a href="#removetimetrigger" title="dom-media-removetimetrigger">removeTimeTrigger</a>(in float time, in TimeTriggerListener listener);

};</pre> 

<pre class="idl">interface <dfn id="time-trigger-listener">TimeTriggerListener</dfn> {
  void <a href="#handletimetrigger" title="timetrigger-listener-handletimetrigger">handleTimeTrigger</a>(in float time);
};</pre> 


        <h5 id=common-dom-attributes><span class=secno>2.3.2.</span> 
        DOM attributes and methods common to <code title=element-video>video</code> and 
        <code title=element-audio>audio</code> elements.</h5>

        <p>The DOM attributes <dfn id=dom-src title=dom-media-src><code>src</code></dfn> 
        and <dfn id=dom-type title=dom-media-type><code>type</code></dfn> 
        each must reflect the respective content attributes of the same name.

        <p>When the <code title=dom-media-src><a href="#dom-src">src</a></code>
        attribute is set, the user agent must immediately begin to download the
        specified resource unless the user agent cannot support <code title=element-video>
        video</code>/<code title=element-audio>audio</code>, or its support for 
        <code title=element-video>video</code>/<code title=element-audio>audio</code> has
        been disabled. The <code title=dom-media-type>type</code>
        attribute is considered at this time, so it should be cleared or reset when the
        <code title=dom-media-src><a href="#dom-src">src</a></code> attribute it set to a media
        resource with a different type. Fallback content must be reconsidered if the
        user agent is unable to load and display the specified resource.
        
        
        <h6 id="time-attributes"><span class=secno>2.3.2.1.</span> Time Attributes</h6>

                <p>Media durations are not always finite. For example: the duration of a "live" RTP stream
                is <em>indefinite</em> as long as it lasts, i.e. such streams typically proceed indefinitely
                without signalling their duration until the server closes the session. </p>
                
                <p>A media resource which has a <em>finite</em> duration may not have a <em>known</em>
                duration, or may not have a precisely known duration, for some period of time even after
                playback can be initiated. For example: MPEG elementary streams, including audio elementary
                streams such as MP3 files, must be completely scanned in order to determine their precise
                duration. If a user agent reports an approximate duration, it must fire a 
                <code title=event-durationchange><a href="#durationchange">durationchange</a></code> event 
                when the estimate is refined or the precise duration becomes known.</p>

                <p>Time values are represented as floating point numbers, representing a length of time in
                seconds. A value of +infinity, ECMAScript <code>Number.POSITIVE_INFINITY</code>, signifies
                an "indefinite" time. A time value of "Not A Number", ECMAScript <code>Number.NaN</code>,
                signifies an unknown or unspecified time value. This approach has the advantage of encouraging 
                script writers to cope with these situations, as opposed to the approach of defining other
                attributes that need to be examined to determine the validity of the duration attribute but
                which are easily ignored.</p>

                <p class="big-issue">It would be helpful to have utility functions to convert from a formatted
                time string to a double and back. Where should these go?</p>
        
                <p>The DOM attribute <dfn id=availableduration title=dom-media-availableduration>
                <code>availableDuration</code></dfn> returns the duration of the portion of media which is 
                available for playing. The user agent must fire an
                <code title=event-availabledurationchange><a href="#availabledurationchange">availabledurationchange</a></code>
                when the portion of media available for playing changes.</p>

                <p>The DOM attribute <dfn id=duration title=dom-media-duration><code>duration</code></dfn> 
                returns the total duration of the complete media file. For some media formats, the value 
                returned may be an estimate. When an estimated duration is returned, the user agent will
                fire a <code title=event-durationchange><a href="#durationchange">durationchange</a></code>
                event when the estimate is refined or the precise duration becomes known.</p>

                <p>The DOM attribute <dfn id=starttime title=dom-media-starttime><code>startTime</code></dfn> 
                gets and sets the time at which a movie begins to play, and the time at which it stops
                when playing in reverse. The initial value is 0. The value must be in the range from 0
                to <code title=dom-media-endtime><a href="#endtime">endTime</a></code>. If the attribute is
                set to a value greater than <code title=dom-media-endtime><a href="#endtime">endTime</a></code>,
                it is clipped to <code title=dom-media-endtime><a href="#endtime">endTime</a></code>.
                <span class="big-issue">Or should it retain the previous value???</span>
                </p>

                <p>The DOM attribute <dfn id=endtime title=dom-media-endtime><code>endTime</code></dfn> 
                gets and sets the time at which a movie stops playing, and the time at which it begins when
                playing in reverse. This attribute is initially set to <code>Number.NaN</code> to signal
                that it has not been set. The value must be in the range from
                <code title=dom-media-starttime><a href="#starttime">startTime</a></code> to 
                <code title=dom-media-duration><a href="#duration">duration</a></code>. If the attribute
                is set to a value outside this range, it is clipped to the nearest legal value.
                <span class="big-issue">Or should it retain the previous value???</span>
                </p>

                <p>The DOM attribute <dfn id=currenttime title=dom-media-currentTime><code>currentTime</code></dfn>
                gets and sets the position of the play head in the media element's timeline.</p>
        
        <h6 id="playback-attributes"><span class=secno>2.3.2.2.</span> Playback Attributes</h6>
                <p>The DOM attribute <dfn id=currentrate title=dom-media-currentrate><code>currentRate</code></dfn> 
                is the rate at which a media element is currently playing.</p>
        
                <p>The DOM attribute <dfn id=playrate title=dom-media-playrate><code>playRate</code></dfn>
                is the rate that is implicitly set on a media element when its play() method is invoked.
                Some media formats do not allow the play rate to be changed, for example a live RTP stream.
                <span class="big-issue"> What should the UA do when someone tries to set the rate on a media
                format that doesn't allow it? Should we specify the behavior?</span> This value is
                initialized to the media resource's intrinsic value, eg. the <a href=
                "http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap2/chapter_3_section_2.html#//apple_ref/doc/uid/TP40000939-CH204-32947">
                <code>"preferred rate"</code></a> of a QuickTime movie, or 1 if there is no
                intrinsic value. Changing the <code title=dom-media-playrate>playRate</code> when an element
                is already playing shall <em>not</em> change the 
                <code title=dom-media-currentrate>currentRate</code>. The rate change does not take effect until
                the <code title=dom-media-play>play()</code> method is called again.</p>
        
                <p>The DOM attribute <dfn id=ispaused title=dom-media-ispaused><code>isPaused</code></dfn> 
                returns a value that specifies whether the element is in a paused state. An element that
                is not paused may have a rate of 0 if it is prerolling. <span class="big-issue">This
                should be clarified</span></p>
        
                <p>The <dfn id=play title=dom-media-play><code>play()
                </code></dfn> method begins playing the element at the <code title=dom-media-playrate>
                <a href="#playrate">playRate</a></code>. </p>
        
                <p>The <dfn id=pause title=dom-media-pause><code>pause()</code></dfn> method sets the 
                play rate to zero.</p>
        
                <p>The <dfn id=step title=dom-media-step><code>step(<var title="">numberOfFrames</var>)
                </code></dfn> method steps the specified number of frames. Negative values step backwards.</p>

        <h6 id="audio-attributes"><span class=secno>2.3.2.3.</span> Audio Attributes</h6>
                <p>The DOM attribute <dfn id=volume title=dom-media-volume><code>volume</code></dfn> 
                gets and sets the audio volume of the movie. Legal values are between '0' and '100',
                values outside of this range are clipped.</p>
        
                <p>The DOM attribute <dfn id=muted title=dom-media-muted><code>muted</code></dfn> 
                gets and sets a value that indicates whether the audio is turned on or off.</p>

        <h6 id="looping-attributes"><span class=secno>2.3.2.4.</span> Looping Attributes</h6>

                <p>The DOM attribute <dfn id=loopcount title=dom-media-loopcount><code>loopCount</code></dfn> 
                gets and sets the number of loop itterations that will be played before the media stops.</p>

                <p>The DOM attribute <dfn id=currentloop title=dom-media-currentloop><code>currentLoop</code></dfn> 
                returns the index of the current itteration of the playback of the media. For example, on the 
                first play through the value will be 0, the second time through it will be 1, etc. Playback
                stops when <code title=dom-media-currentloop><a href="#currentloop">currentloop</a></code>
                equals <code title=dom-media-loopcount><a href="#loopcount">loopCount</a></code>.</p>

                <p>The DOM attribute <dfn id=loopstarttime title=dom-media-loopstarttime><code>loopStartTime</code></dfn> 
                gets and sets the time at which a movie begins to play after looping, and the time at which
                it loops when playing in reverse. The initial value is 0. The value must be in the range from 0
                to <code title=dom-media-loopendtime><a href="#loopendtime">loopEndTime</a></code>.
                If the attribute is set to a value outside this range, it is clipped to the nearest legal value. 
                <span class="big-issue">Or should it retain the previous value???</span>
                </p>

                <p>The DOM attribute <dfn id=loopendtime title=dom-media-loopendtime><code>loopEndTime</code></dfn> 
                gets and sets the time at which a movie loops, and the time at which it begins to play 
                after looping when playing in reverse. This attribute is initially set to <code>Number.NaN</code> 
                to signal that it has not been set. The value must be in the range from the
                <code title=dom-media-loopstarttime><a href="#loopstarttime">loopStartTime</a></code>
                to <code title=dom-media-duration><a href="#duration">duration</a></code>. If the attribute
                is set to a value outside this range, it is clipped to the nearest legal value.
                <span class="big-issue">Or should it retain the previous value???</span>
                </p>

        <h6 id="characteristics-attributes"><span class=secno>2.3.2.5.</span> Characteristics</h6>
                <p>The DOM attribute <dfn id=hasaudio title=dom-media-hasaudio><code>hasAudio</code></dfn> 
                returns a value that specifies whether the element has audio media.</p>

                <p>The DOM attribute <dfn id=hasvisual title=dom-media-hasvisual><code>hasVisual</code></dfn> 
                returns a value that specifies whether the element can draw on the screen. An 
                <code title=element-audio><a href="#audio">audio</a></code> element whose 
                <code title="attr-media-src">src</code>
                attribute specifies a media resource that contains visual media shall return false since
                the visual media will not be rendered.</p>

        <h6 id="state-attributes"><span class=secno>2.3.2.6.</span> State</h6>
                <p>The DOM attribute <dfn id=mediastatus title=dom-media-mediastatus><code>mediaStatus</code></dfn> 
                returns the current state of the media element taking into consideration its current loading
                progress and its playability. As loading progresses and playability changes, appropriate
                events (e.g., "mediaunderstandable", "mediapresentable", "load") should be fired. However,
                as it may be necessary to know the current state of the media element after state
                transitions have already occurred, the mediaStatus attribute can be retrieved to know the
                media element's current status.</p>
                
                <p>When the element is created the attribute must be set to 0. It can have the following
                values:</p>

                <dl>
                        <dt>0 <dfn id=uninitialized title=dom-media-UNINITIALIZED><code>UNINITIALIZED</code></dfn> 
                                <dd>The initial value.

                        <dt>1 <dfn id=error title=dom-media-ERROR><code>ERROR</code></dfn> 
                                <dd>This playability state indicates that some kind of error has occurred (which
                                should also be signaled by an error event). One reason this state might be set is
                                that the media file is invalid.

                        <dt>2 <dfn id=understandable title=dom-media-UNDERSTANDABLE><code>UNDERSTANDABLE</code></dfn> 
                                <dd>Attributes of the media element are now available for retrieval (e.g.,
                                <code title=dom-media-duration><a href="#duration">duration</a></code>). It however 
                                has not reached a state where it can render anything (e.g., an image if the media
                                type is visual) or an attempt to play the content should be made.

                        <dt>3 <dfn id=presentable title=dom-media-PRESENTABLE><code>PRESENTABLE</code></dfn> 
                                <dd>The media element has loaded sufficient media data to render at the current time
                                (e.g., it can render the video frame at the current time). It has not however loaded
                                sufficient media data so that setting the 
                                <code title=dom-media-currentrate><a href="#currentrate">currentRate</a></code>
                                property to a non-zero value will render anything (video or audio) more.

                        <dt>4 <dfn id=playable title=dom-media-PLAYABLE><code>PLAYABLE</code></dfn> 
                                <dd>The media element has loaded sufficient media data so that if the play rate was
                                set to a non-zero value, time will advance.

                        <dt>5 <dfn id=playthroughok title=dom-media-PLAYTHROUGHOK><code>PLAYTHROUGHOK</code></dfn> 
                                <dd>The media element has loaded sufficient media data and playback conditions
                                (e.g., download rates, data rate of the media, playback rate) should allow for
                                uninterrupted playback (i.e., no stalls) if the current playback rate is set to the
                                value of playbackRate.

                        <dt>6 <dfn id=loaded title=dom-media-LOADED><code>LOADED</code></dfn> 
                                <dd>All necessary media data for the media element is available (and no data will be
                                evicted). This is not strictly the same thing as all data for the media element's
                                file or files is local, only that all data that can be referenced during playback 
                                will remain available for the life span of the element. To detect if all data 
                                across the media element's files is available, listen for the load event.
                </dl>

                <p>The <code title=dom-media-mediastatus><a href="#mediastatus">mediaStatus</a></code>
                attribute and associated events are useful to an implementor of a custom play controller as
                they can wait for <code title=dom-media-PLAYTHROUGHOK><a href="#playthroughok">PLAYTHROUGHOK</a></code>
                or <code title=dom-media-LOADED><a href="#loaded">LOADED</a></code> to know that autoplay may start. Likewise, if
                during playback, the playback catches up with download, one can pause playback by checking
                for a state less than <code title=dom-media-PLAYABLE><a href="#playable">PLAYABLE</a></code>.</p>

                <p>The mediaStatus state values are ordered so that as the media becomes more playable, the
                values increase. An effect of this is that to detect if the current playability allows for
                querying media properties (i.e., the media element is "understandable"), one can compare the current
                <code title=dom-media-mediastatus><a href="#mediastatus">mediaStatus</a></code> against 
                <code title=dom-media-UNDERSTANDABLE><a href="#understandable">UNDERSTANDABLE</a></code>.
                If equal to or greater than <code title=dom-media-UNDERSTANDABLE><a href="#understandable">UNDERSTANDABLE</a></code>
                , then properties can be queried. 
                If less than <code title=dom-media-UNDERSTANDABLE><a href="#understandable">UNDERSTANDABLE</a></code>
                (including the <code title=dom-media-ERROR><a href="#error">ERROR</a></code> state), 
                properties should not be requested.</p>

                <p>The following state chart illustrates the possible <code title=dom-media-mediastatus>mediaStatus</code>
                state transitions.</p>
        <img src="movie-status-states.png" alt="State chart" />

                <p>It is possible for the states reported by <code title=dom-media-mediastatus><a href="#mediastatus">mediaStatus</a></code>
                to regress as the result of a seek, a change in network conditions (bandwidth changes or
                connection drops), changes in play rate/direction, changes in looping, cache unloading, etc.
                Such changes from any of the presentable/playable states (i.e., 
                <code title=dom-media-PRESENTABLE><a href="#presentable">PRESENTABLE</a></code>, 
                <code title=dom-media-PLAYABLE><a href="#playable">PLAYABLE</a></code>,
                <code title=dom-media-PLAYTHROUGHOK><a href="#playthroughok">PLAYTHROUGHOK</a></code>)
                may push the media element's current media status to an earlier state,
                including <code title=dom-media-UNDERSTANDABLE><a href="#understandable">UNDERSTANDABLE</a></code>.

                <p>To accommodate media playback scenarios where previously loaded media data may be evicted
                during playback (e.g., because of limited caching by the user agent), the 
                <code title=dom-media-LOADED><a href="#loaded">LOADED</a></code> state (and
                the firing of the "load" event) may only occur if all data becomes loaded and cannot be
                evicted during the life of the media element.</p>


        <h6 id="time-triggers"><span class=secno>2.3.2.7.</span> Time triggers</h6>
                <p>The <dfn id=settimetrigger title=dom-media-settimetrigger>
                <code>setTimeTrigger(<var title="">time</var>, <var title="">listener</var>)</code>
                </dfn> method registers a callback for when the media element plays through 
                <var title="">time</var>. <var title="">listener</var> must be an object implementing
                the <code><a href="#time-trigger-listener">TimeTriggerListener</a></code> interface, or a JavaScript 
                function.</p>
        
        
                <p>The <dfn id=removetimetrigger title=dom-media-removetimetrigger>
                <code>removeTimeTrigger(<var title="">time</var>, <var title="">listener</var>)</code>
                </dfn> method removes a previously registered <code><a href="#time-trigger-listener">
                TimeTriggerListener</a></code> from a media element.</p>

        <h2 id="events"><span class="secno">3.</span> Events</h2> 
        
        <h3 id=load-events><span class=secno>3.1.</span> Media loading events</h3>

        <div class='event-definition'>
                <dl>
                        <dt><dfn id=eventdef-event-abort class=event-abort><strong>abort</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>abort
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>Yes
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-abort>abort</code> event is fired when loading of the media
                        element is canceled.
                </dl>
        </div>

        <div class='event-definition'>
                <dl>
                        <dt><dfn id=eventdef-event-mediarendererror class=event-mediarendererror><strong>mediarendererror</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>mediarendererror
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>Yes
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-mediarendererror>mediarendererror</code> event is fired if a
                        non-fatal error occurs during media playback that prevents the media resource from being
                        completely rendered. For example: media type is not supported, i.e. the resource
                        contains one or more renderable substreams of types not supported by the user agent; a
                        media format is not supported, i.e. a renderable substream of a type that's supported by
                        the user agent contains media that can't be decoded; or media can't be rendered under
                        current constraints. Here there's no problem with media types or formats but the
                        resource can't be rendered anyway, possibly temporarily.
                </dl>
        </div>

        <div class='event-definition'>
                <dl>
                        <dt><dfn id=eventdef-event-error class=event-error><strong>error</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>error
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>Yes
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-error>error</code> event is fired if an error occurs during
                        the loading of the media element. This event should not be fired if the loading was
                        canceled; the abort error should be fired in that case.
                </dl>
        </div>

        <div class='event-definition'>
                <dl>
                        <dt><dfn id=eventdef-event-load class=event-load><strong>load</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>load
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>No
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-load>load</code> event is fired when the media resource is
                        completely loaded by the client. It should only be fired if the data will remain
                        available for the life span of the element. Video and audio elements should be
                        excluded from consideration for the document "load" event.
                </dl>
        </div>
<code title=event-load><a href=#eventdef-event-load">load</a></code>
        <div class='event-definition'>
                <dl>
                        <dt><dfn id=eventdef-event-ratechange class=event-ratechange><strong>ratechange</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>ratechange
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>No
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-ratechange>ratechange</code> event is fired soon after the 
                        <code title=dom-media-currentrate><a href="#currentrate">currentRate</a></code> property 
                        is changed from its previous value. Inspect the object's currentRate property for the new rate
                        value. To detect that playback is starting, check that the new 
                        <code title=dom-media-currentrate><a href="#currentrate">currentRate</a></code> is
                        non-zero; to detect that playback has paused, check that the new 
                        <code title=dom-media-currentrate><a href="#currentrate">currentRate</a></code> is zero (0).
                </dl>
        </div>

        <div class='event-definition'>
                <dl>
                <dt><dfn id=eventdef-event-volumechange class=event-volumechange><strong>volumechange</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>volumechange
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>No
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-volumechange>volumechange</code> event is fired after either
                        the <code title=dom-media-volume><a href="#volume">volume</a></code>
                        or the <code title=dom-media-muted><a href="#muted">muted</a></code> property has changed from its
                        previous value. Inspect the object's properties for the new value.
                </dl>
        </div>

        <div class='event-definition'>
                <dl>
                <dt><dfn id=eventdef-event-durationchange class=event-durationchange><strong>durationchange</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>durationchange
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>No
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-durationchange>durationchange</code> event is fired if the 
                        <code title=dom-media-duration><a href="#duration">duration</a></code>
                        property of the media element changes. One reason this might occur is when the 
                        <code title=dom-media-duration><a href="#duration">duration</a></code> for the media element
                        which was previously estimated becomes known during loading. It might change for 
                        other reasons that are not defined here.
                </dl>
        </div>

        <div class='event-definition'>
                <dl>
                <dt><dfn id=eventdef-event-availabledurationchange class=event-availabledurationchange><strong>availabledurationchange</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>availabledurationchange
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>No
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-availabledurationchange>availabledurationchange</code> 
                        event is fired if the <code title=dom-media-availableduration><a href="#availableduration">availableduration</a></code>
                        property of the media element changes. One reason this might occur is during progressive
                        download as more media is downloaded. It might change for other reasons that are not
                        defined here. 
                </dl>
                <p class="big-issue">How often should the availabledurationchange event fire? Too often and we
                waste a lot of cycles, too infrequently and the UI can get out of sync with reality.
                Specifying a minimum time interval, eg. "at least once a second", is wasteful in a long file
                when the play head is not near the available duration, but useful when the two are close...
                </p>
        </div>

        <div class='event-definition'>
                <dl>
                <dt><dfn id=eventdef-event-loop class=event-loop><strong>loop</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>loop
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>No
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-loop>loop</code> event is fired when the media is playing 
                        through a loop prior to its final loop according to its <code title=dom-media-loopcount>
                        <a href="#loopcount">loopCount</a></code>.
                </dl>
        </div>

        <div class='event-definition'>
                <dl>
                <dt><dfn id=eventdef-event-playcomplete class=event-playcomplete><strong>playcomplete</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>playcomplete
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>No
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-playcomplete>playcomplete</code> event is fired when the element
                        automatically stops playback because it reaches the limit of playback (i.e., the value of the 
                        <code title=dom-media-endtime><a href="#endtime">endTime</a></code>
                        property if playing forward, <code title=dom-media-starttime><a href="#starttime">startTime</a></code>
                        if playing backward) and the media is playing through its final repetition, according to its
                        <code title=dom-media-loopcount><a href="#loopcount">loopCount</a></code>.
                </dl>
        </div>

        <div class='event-definition'>
                <dl>
                <dt><dfn id=eventdef-event-timejump class=event-timejump><strong>timejump</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>timejump
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>No
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-timechange>timechange</code> event is fired when the media element's 
                        current time changes by any other means than playback at the current rate. This can be either by an explicit
                        change to the <code title=dom-media-currenttime><a href="#currenttime">currentTime</a></code>
                        property (e.g., under script control) or by any other means than playback at the current rate. 
                        In other words, this event is not fired during play back but is fired if the 
                        <code title=dom-media-currenttime><a href="#currenttime">currentTime</a></code> 
                        property is explicitly changed. Setting the <code title=dom-media-currenttime>
                        <a href="#currenttime">currentTime</a></code> to its current value shall not fire the timechange event.
                </dl>
        </div>


        <h3 id=playback-events><span class=secno>3.2.</span> Media playback events</h3>
        <div class='event-definition'>
                <dl>
                <dt><dfn id=eventdef-event-mediaunderstandable class=event-mediaunderstandable><strong>mediaunderstandable</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>mediaunderstandable
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>No
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-mediaunderstandable>mediaunderstandable</code> event is 
                        fired when the element's <code title=dom-media-mediastatus>
                        <a href="#mediastatus">mediaStatus</a></code> transitions to or
                        past the UNDERSTANDABLE state. This indicates that attributes of the object that are
                        dependent upon the media resource or the loading of the resource (e.g., 
                        <code title=dom-media-duration><a href="#duration">duration</a></code>,
                        <code title=dom-media-availableduration><a href="#availableduration">availableDuration</a></code>,
                        <code title=dom-media-hasaudio><a href="#hasaudio">hasAudio</a></code>, etc)
                        can be retrieved. The UNDERSTANDABLE state does not
                        indicate that the element can render anything (e.g., drawing a frame if the media 
                        is visual or decoding audio if it has audio).
                </dl>
        </div>

        <div class='event-definition'>
                <dl>
                <dt><dfn id=eventdef-event-mediapresentable class=event-mediapresentable><strong>mediapresentable</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>mediapresentable
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>No
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-mediapresentable>mediapresentable</code> event is fired 
                        when the element's <code title=dom-media-mediastatus>
                        <a href="#mediastatus">mediaStatus</a></code> transitions to or past the
                        the PRESENTABLE state. This indicates that the media object can render something at
                        the current time (e.g., it can render the video frame at the current time). The
                        PRESENTABLE state does not however indicate that it has loaded sufficient media so
                        that setting the <code title=dom-media-currentrate><a href="#currentrate">currentRate</a></code>
                        property to a non-zero value will render anything more (video or audio).

                </dl>
        </div>

        <div class='event-definition'>
                <dl>
                <dt><dfn id=eventdef-event-mediaplayable class=event-mediaplayable><strong>mediaplayable</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>mediaplayable
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>No
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-mediaplayable>mediaplayable</code> event is fired 
                        when the element's <code title=dom-media-mediastatus>
                        <a href="#mediastatus">mediaStatus</a></code> transitions to or past the
                        PLAYABLE state. This indicates the object has loaded sufficient media data so that
                        if the <code title=dom-media-currentrate><a href="#currentrate">currentRate</a></code>
                        is set to a non-zero value, time will advance. An example usage
                        would be not to allow the play button in a custom movie controller to take effect
                        unless this state or better has been reached.
                </dl>
        </div>

        <div class='event-definition'>
                <dl>
                <dt><dfn id=eventdef-event-mediacanplaythrough class=event-mediacanplaythrough><strong>mediacanplaythrough</strong></dfn>
                        <dd>
                        <table >
                                <tr><th><em>Type:</em><td>mediacanplaythrough
                                <tr><th><em>Namespace:</em><td>TBD
                                <tr><th><em>Interface:</em><td><a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-Event">Event</a>
                                <tr><th><em>Cancelable:</em><td>No
                                <tr><th><em>Bubbles:</em><td>No
                                <tr><th><em>Target:</em><td>Element
                                <tr><th><em>Context info:</em><td>None
                        </table>
                        <p>The <code title=event-mediacanplaythrough>mediacanplaythrough</code> event is 
                        fired when the element's <code title=dom-media-mediastatus>
                        <a href="#mediastatus">mediaStatus</a></code> transitions to
                        or past the PLAYTHROUGHOK state. This indicates the object has loaded sufficient
                        media data and playback conditions (e.g., download rates, data rate of the media,
                        playback rate) are sufficient to allow for uninterrupted playback (i.e., no stalls)
                        if the current playback rate is set to the value of <code title=dom-media-playrate>
                        <a href="#playrate">playRate</a></code>. 
                </dl>
        </div>

        <h2 id="window-additions"><span class="secno">4.</span> WindowHTML Additions</h2> 

        <p>The <code><a href="#windowhtml">WindowHTML</a></code> object must
        provide the following constructors:
        
        <dl>
                <dt><dfn id=audio-constructor title=dom-audio-constructor><code>Audio()</code></dfn>
                
                <dd>
                <p>Constructs an <code><a href="#html-audio-element">
                HTMLAudioElement</a></code> object (a new <code title=element-audio><a href="#audio">audio</a></code>
                element).

                <dt><dfn id=video-constructor title=dom-video-constructor><code>Video()</code></dfn>
                
                <dt><dfn id=video-constructor-w title=dom-video-constructor-w><code>Video(in unsigned long <var
                title="">width</var>)</code></dfn>
                
                <dt><dfn id=video-constructor-wh title=dom-video-constructor-wh><code>Video(in unsigned long <var
                title="">width</var>, in unsigned long <var title="">height</var>)</code></dfn>
        
                <dd>
                <p>Constructs an <code><a href="#html-video-element">
                HTMLVideoElement</a></code> object (a new
                <code title=element-video><a href="#video">video</a></code> element). If the <var title="">width</var>
                and <var title="">height</var> arguments are both present, the new object's <code title=video-element-width>
                <a href="#dom-video-width">width</a></code> and <code title=video-element-height><a href="#dom-video-height">
                height</a></code> content attributes must be set to <var title="">width</var> and
                <var title="">height</var>. If only the <var title="">width</var> argument is present,
                the new object's <code title=video-element-width><a href="#dom-video-width">width</a></code> content
                attribute must be set to <var title="">width</var> and the <code title=video-element-height>
                <a href="#dom-video-height">height</a></code> content attribute must be set to a value that 
                maintains the media resource's intrinsic aspect ratio.
        </dl>



        <h2 class=no-num id=references>References</h2>

        <p>All references are normative unless marked "Informative".

        <dl>
                <dt id=refsCSS21>[CSS21]

                <dd><cite><a href="http://www.w3.org/TR/2006/WD-CSS21-20061106">
                        Cascading Style Sheets, level 2 revision 1 CSS 2.1 Specification
                </a></cite>, 
                H&aring;kon Wium Lie, Tantek &Ccedil;elik, Bert Bos, and Ian Hickson, Editors.
                World Wide Web Consortium, 06&nbsp;Nov&nbsp;2006.
                CSS 2.1 Specification is available at http://www.w3.org/TR/2006/WD-CSS21-20061106
                
                <dt id=refsRFC2046>[RFC2046]
                
                <dd><cite><a href="http://www.ietf.org/rfc/rfc2046">
                        Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types
                </a></cite>, 
                N. Freed, N. Borenstein. IETF, November&nbsp;1996. 
                RFC 2046 is available at http://www.ietf.org/rfc/rfc2046
                
                <dt id=refsRFC4281>[RFC4281]
                
                <dd><cite><a href="http://www.ietf.org/rfc/rfc4281">
                        The Codecs Parameter for "Bucket" Media Types
                </a></cite>, 
                R. Gellens, D. Singer, P. Frojdh. IETF, November&nbsp;2005. 
                RFC 4281 is available at http://www.ietf.org/rfc/rfc4281
                
        </dl>

        
        <h2 class=no-num id=acknowledgements>Acknowledgements</h2>
                <p class="big-issue">Coming soon</p>
        
</body>
</html>

